import json

import numpy as np
import pandas as pd
import yaml

from yaml import SafeLoader

from datareport.api import ConfigClass
from datareport.api.DataSource import DataSource
from datareport.api.annotation.Font import Font
from datareport.impl.paragraph.base.BaseParagraph import BaseParagraph
from datareport.api.annotation.Style import style


@style()
class KaiZhanQingKuang_zhiliangpinjia_zhengti_51(BaseParagraph):
    """
    本年度校级组织生活 开展质量评价-整体
     对 教 师 党 支 部 和 学 生 党 支 部 的 分 类 评 价 来 看 ，\
教 师 党 支 部 整 体 得 分 高 于 学 生 党 支 部 。 具 体 情 况 如 下 表 。
    """

    def __init__(self):
        super().__init__()
        self.text = '''1 、 整 体 情 况 ： 累 计 回 收 即 时 评 价 表{}份 ，\ 
从 整 体 评 价 来 看 ， 综 合 得 分 为 {} 分 ， 其 中 ， 工 作 体 现 程 度\
得 分 为 {}分 ， 可 借 鉴 情 况 得 分 为 {}分 。 '''

        self.sort = 40
        self.section = 16

    def plot(self, df, plt):
        pass

    def getData(self, result):
        pass

    def start(self, conn, year, plt):
        conn1 = DataSource(ConfigClass.data['datasource1']).conn
        df = pd.read_sql('''select topic16,p.partyBranchName,p.partyOrgName 
        from t_observerRecord r 
        inner join t_meetinginfo p 
        on r.activityId=p.activityId
        where topic16 is not null and year(r.createTime)={}'''.format(year), con=conn)

        dzz_df=pd.read_sql('''select name,党支部类型 from v_dzzinfo''',con=conn1)
        ##
        record_df = pd.DataFrame(columns=['二级党组织', '党支部', '综合得分', '工作体现程度', '可借鉴情况'])
        df = parser(record_df, df)
        df['count'] = 1
        dzb = df.groupby(['二级党组织','党支部']).agg({'综合得分': 'mean', '工作体现程度': 'mean', '可借鉴情况': 'mean', 'count': 'sum'}).reset_index(drop=False)
        dzb['学生党支部'] = dzb['党支部'].apply(lambda x:isStu(x,dzz_df))

        dzb['教师党支部'] = dzb['党支部'].apply(lambda x:isTea(x,dzz_df))

        dzz = dzb.groupby('二级党组织').agg({'综合得分': 'mean', '工作体现程度': 'mean', '可借鉴情况': 'mean', 'count': 'sum'}).reset_index(drop=False)

        ## 观摩评价结果
        result=pd.DataFrame(columns=['类别', '综合得分', '工作体现程度', '可借鉴情况'])
        result=result.append({'类别':'整体情况','综合得分':round(dzz['综合得分'].mean(),2),
                       '工作体现程度':round(dzz['工作体现程度'].mean(),2),'可借鉴情况':round(dzz['可借鉴情况'].mean(),2)},ignore_index=True)
        result=result.append({'类别':'学生党支部','综合得分':round(dzb[dzb['学生党支部']==1]['综合得分'].mean(),2),
                       '工作体现程度':round(dzb[dzb['学生党支部']==1]['工作体现程度'].mean(),2),
                       '可借鉴情况':round(dzb[dzb['学生党支部']==1]['可借鉴情况'].mean(),2)},ignore_index=True)
        result=result.append({'类别': '教师党支部', '综合得分': round(dzb[dzb['教师党支部']==1]['综合得分'].mean(),2),
                       '工作体现程度':round(dzb[dzb['教师党支部']==1]['工作体现程度'].mean(),2),
                       '可借鉴情况':round(dzb[dzb['教师党支部']==1]['可借鉴情况'].mean(),2)},ignore_index=True)
        self.tables.append(result.fillna(0))

        self.fonts.append(Font(text='1 、整 体 情 况：累 计 回 收 即 时 评 价 表{}份 ，\
从 整 体 评 价 来 看 ，'.replace(' ','').format(len(df))))
        self.fonts.append(Font(text='综合得分为{}分，'.format(round(dzz['综合得分'].mean(),2)),bold=True))
        self.fonts.append(Font(text='其中，工 作 体 现 程 度得 分 为 {}分，'.replace(' ','').format(round(dzz['工作体现程度'].mean(),2)),bold=True))
        self.fonts.append(Font(text='可 借 鉴 情 况 得 分 为 {}分 。'.replace(' ','').format(round(dzz['可借鉴情况'].mean(),2)),bold=True))
        self.fonts.append(Font(text='具体情况如下表。'))

def isStu(x,dzz):
    if ('本专科生' in dzz[dzz['name']==x]['党支部类型'].values[0]) \
        or ('研究生' in dzz[dzz['name']==x]['党支部类型'].values[0]):
        return 1
    else:
        0

def isTea(x,dzz):
    if ('教职工' in dzz[dzz['name']==x]['党支部类型'].values[0]) :
        return 1
    else:
        0

def parser(record_df, df):
    for i in np.arange(len(df)):
        record = json.loads(df.iloc[i]['topic16'])
        ## 工作体现程度
        workReflection = 0
        ## 借鉴情况
        reference = 0
        ## 综合得分
        overall = 0
        for b in record[0]['body']:
            workReflection += b['value'] / len(record[0]['body'])
            overall += b['value'] / (len(record[0]['body']) + len(record[1]['body']))
        for b in record[1]['body']:
            reference += b['value'] / len(record[1]['body'])
            overall += b['value'] / (len(record[0]['body']) + len(record[1]['body']))
        record_df = record_df.append({'二级党组织': df.iloc[i]['partyOrgName'], '党支部': df.iloc[i]['partyBranchName'],
                                      '综合得分': overall, '工作体现程度': workReflection, '可借鉴情况': reference}, ignore_index=True)
    return record_df


def list2str(l):
    return '、'.join(l)


if __name__ == '__main__':
    with open('D:\work\sanhuiyike\datareport\config.yaml', encoding='utf-8') as f:
        data = yaml.load(f, Loader=SafeLoader)
    con = DataSource(data['datasource']).conn
    KaiZhanQingKuang_zhiliangpinjia_zhengti_51().start(con, 2023, '')
